package com.bjpowernode.springboot.controller;


import com.bjpowernode.springboot.entity.RegisterErrorBean;
import com.bjpowernode.springboot.entity.UserBean;
import com.bjpowernode.springboot.service.UserService;
import com.bjpowernode.springboot.utils.RegexUtil;
import com.bjpowernode.springboot.utils.UserBeanUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * 注册控制层
 */
@SuppressWarnings("all")
@RequestMapping(value = "/do-register")
@Controller
public class RegisterController {

    @Autowired
    private RegisterErrorBean registerErrorBean; // 注入注册错误信息Bean实体，封装注册错误信息

    @Autowired
    private RegexUtil regexUtil; // 注入正则工具类

    @Autowired
    private UserService userService; // 辅助user注册的service对象

    private static final Optional<String> optionalString = Optional.empty(); // 单例，创建Optional对象，用于判断null

    /**
     * 注册，注册成功，显示注册成功页面，然后提示用户5s之后进入到登录页面
     * 1. 对用户名和密码做检验，看是否符合要求
     * 2.
     * @return
     */
    @RequestMapping(value = "/register")
    public ModelAndView do_register(HttpServletRequest request,HttpServletResponse response) {
        // 获取用户的输入
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String usr_input_verCode = request.getParameter("verCode").toLowerCase(); // 用户输入获取验证码

        // 获取实际生成的验证码
        HttpSession session = request.getSession(); // session对象，用户获取页面中的生成的二位码

        String verCode = session.getAttribute("verCode").toString().toLowerCase(); // Servlet生成的二维码

        // 创建视图数据对象
        ModelAndView mv = new ModelAndView();

        // 验证输入
        // 验证顺序：二维码--->个人信息，之所以按照这个顺序是因为，二维码的错误和后台数据库中的数据无关
        // 如果先判断个人信息，每次我们都需要从mysql中获取出数据进行比较，这样频繁的mysql交互会带来性能
        // 的影响,尤其实在数据量非常大的时候
        // 验证用户名，密码和验证码是否为空，因为这不需要和mysql进行交互
        if ("".equals(username) || "".equals(password) || "".equals(usr_input_verCode)) {
            mv.addObject(registerErrorBean.getRegister_error_message(),registerErrorBean.getNullInputError());
            mv.setViewName("register-error");
            return mv;
        }

        // 判断验证码是否输入正确(在上面的代码中我们已经将输入和显示的验证码全部转化为小写，一般情况下可以忽略大小写)
        if (!verCode.equals(usr_input_verCode)) {
            mv.addObject(registerErrorBean.getRegister_error_message(),registerErrorBean.getVercodeInputError());
            mv.setViewName("register-error");
        }

        // 判断用户注册信息
        // 定义用户名格式：长度在[8,12] 首字母不能为数字 用户名中只能包含数字和字母(大小写都可以)
        if (Character.isDigit(username.charAt(0)) || !regexUtil.judgeLen(username,6,12)) {
            mv.addObject(registerErrorBean.getRegister_error_message(),registerErrorBean.getFormatInputError()+ ":" + registerErrorBean.getUSERNAME());
            mv.setViewName("register-error");
            return mv;
        }
        // 判断用户名是否重复
        List<UserBean> userBeans = userService.queryAll(); // 查询出所有的用户信息进行比较
        for (UserBean userBean : userBeans) {
            if (userBean.getUsername().equals(username)) {
                mv.addObject(registerErrorBean.getRegister_error_message(),registerErrorBean.getRepeatError() + ":" + registerErrorBean.getUSERNAME());
                mv.setViewName("register-error");
                return mv;
            }
        }

        // 验证输入的密码格式
        if (!regexUtil.judgeLen(password,8,14)) {
            mv.addObject(registerErrorBean.getRegister_error_message(),registerErrorBean.getFormatInputError() + ":" + registerErrorBean.getPASSWORD());
            mv.setViewName("register-error");
            return mv;
        }

        // 经过上述的判断之后，用户的注册信息是正确的，我们将其封装到UserBean对象中，然后保存到mysql中
        // 创建UserBean实体，封装用户的注册信息
        UserBean userBean = new UserBean();
        HashMap<String, Object> userRegisterInfoMap = new HashMap<>();
        userRegisterInfoMap.put("username",username);
        userRegisterInfoMap.put("password",password);
        UserBeanUtils.UserBeanPopulate(userBean,userRegisterInfoMap); // userbean工具类，封装成员属性

        // 保存到mysql中
        userService.addRegisterUser(userBean); // 返回一个布尔值，判断是否保存成功

        /**
         * 注意attributeName中不能出现-,  比如 a-b的形式，否则thmyleaf无法解析
         */
        // 通过前端来控制
        mv.setViewName("register-success");
        return mv;
    }
}
